import { Injectable } from '@nestjs/common';
import Redis from 'ioredis';

@Injectable()
export class RedisService {
  private redisClient: Redis;

  constructor() {
    // 初始化Redis连接
    this.redisClient = new Redis({
      host: process.env.REDIS_HOST || 'redis-17770.crce178.ap-east-1-1.ec2.redns.redis-cloud.com',
      port: Number(process.env.REDIS_PORT) || 17770,
      username: process.env.REDIS_USERNAME || 'shiyu',
      password: process.env.REDIS_PASSWORD || 'Sdd12100.',
      db: Number(process.env.REDIS_DB) || 0,
    });

    // 监听连接错误
    this.redisClient.on('error', (err) => {
      console.error('Redis连接错误:', err);
    });

    // 监听连接成功
    this.redisClient.on('connect', () => {
      console.log('Redis连接成功');
    });
  }

  /**
   * ! 存储验证码到Redis
   * @param key 键名
   * @param code 验证码
   * @param expire 过期时间（秒）
   */
  async setCode(key: string, code: string, expire: number = 300): Promise<void> {
    try {
      // 校验验证码是否为空
      if (!code) {
        throw new Error('验证码不能为空');
      }
      // 校验过期时间是否有效
      if (expire <= 0) {
        throw new Error('过期时间必须大于0秒');
      }

      // 存储验证码到Redis
      await this.redisClient.setex(key, expire, code);
    } catch (error) {
      console.error('Redis存储验证码失败:', error);
      throw new Error('存储验证码失败');
    }
  }

  /**
   * ! 从Redis获取验证码
   * @param key 键名
   * @returns 验证码
   */
  async getCode(key: string): Promise<string | null> {
    try {
      return await this.redisClient.get(key);
    } catch (error) {
      console.error('Redis获取验证码失败:', error);
      throw new Error('获取验证码失败');
    }
  }

  /**
   * 关闭Redis连接
   */
  async close(): Promise<void> {
    await this.redisClient.quit();
  }
}